import axios from 'axios'
import store from '@/store'
import router from '@/router'

const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 5000
})

service.interceptors.request.use(
  config => {
    const token = store.getters.token
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)
// 响应拦截器
// 知识点1: axios内部的处理机制
// 方式1: http状态码处理:
// (1): http状态码为2xx, 3xx, 就会给Promise对象位置, 返回成功的结果(resolve())
// (2): http状态码为4xx, 5xx, 就会给Promise对象位置, 返回错误的结果(reject())
// 如果你想做一些操作, 你可以在axios的响应拦截器, 自己来处理返回的结果
// 补充: http状态码, 由本次请求后, 后端进行设置返回的
// 方式2: 后台返回的对象里code字段/success字段("逻辑字段"判断)
service.interceptors.response.use(
  response => {
    const { success, message } = response.data
    if (!success) {
      return Promise.reject(new Error(message)) // 特殊：它返回到的是axios调用在原地留下的‘Promise’对象位置（逻辑页面await 后面）
    }
    return response.data
  },
  error => {
    // 身份过期
    if (error.response.data.code === 10002) {
      store.commit('user/REMOVE_STATE')
      store.commit('user/REMOVE_TOKEN') // 内部会删除本地cookie里的 token
      // router.currentRoute 路由对象内置的, 也拿到当前页面路由的信息对象
      router.replace(`/login?redirect=${encodeURIComponent(router.currentRoute.fullPath)}`)
    }
    return Promise.reject(error)
  }
)

export default service
